// 监听器
class Observer{
    constructor(data){
        this.data = data;
        this.walk(this.data);
    }
    
    walk(data){
        Object.keys(data).forEach((key) => {
            this.defineReactive(data,key,data[key])
        })
    }

    defineReactive(data,key,val){
        var dep = new Dep;
        var childObj = observe(data[key]);
        Object.defineProperty(data,key,{
            enumerable:true,
            configurable:true,
            get(){
                if(Dep.target){
                    dep.addsub(Dep.target);
                }
                return val;
            },
            set(newVal){
                if(val === newVal) return;
                val = newVal;
                dep.notify();
            }
        })
    }
}

function observe(data){
    if(!data || typeof data !== 'object'){
        return;
    }
    return new Observer(data);
}


// 观察者集合
class Dep{
    constructor(){
        this.subs = [];
    }

    addsub(sub){
        this.subs.push(sub);
    }

    notify(){
        this.subs.forEach((e) => {
            e.update();
        })
    }
}

Dep.target = null;

// 一个值，在一个地方调用就会创建一个观察者，同一个值的观察者在同一个集合中

// 值为发布者，在一个地方调用就是一个订阅，当发布者改变时，通知所有订阅者